package com.example.xmppchatter;

import org.jivesoftware.smack.SmackAndroid;
import com.example.xmppchatter.R;
import aSmackClient.MyXmppClient;
import android.app.Activity;
import android.app.ProgressDialog;
import android.content.Context;
import android.content.Intent;
import android.os.AsyncTask;
import android.os.Bundle;
import android.view.View;
import android.widget.EditText;
import android.widget.Spinner;
import android.widget.Toast;

/**
 * Activity Launcher. Gestisce le operazioni per effettuare il login.
 * @author giulio
 */
public class ActivityMain extends Activity {

	private String className = "[" + this.getClass().getSimpleName() + "] ";
	
	private MyXmppClient chatClient = MyXmppClient.getInstance();
	
	@Override
	protected void onCreate(Bundle savedInstanceState) {
		super.onCreate(savedInstanceState);
		setContentView(R.layout.activity_main);		
		System.out.println(className + "On Create");
		
		// inizializza alcuni parametri della libreria asmack
		SmackAndroid.init(this.getApplicationContext());
	}
	
	@Override
	protected void onRestart() {
		super.onRestart();
		System.out.println(className + "On Restart");		
		
		LogoutAsyncTask at = new LogoutAsyncTask();
		at.execute();
	}

	// gestisce l'evento del click del bottone
	public void onButtonClicked(View v) {
		
		// avvia l'AsyncTask per la connessione
		LoginAsyncTask at = new LoginAsyncTask(getApplicationContext());
		at.execute();
	}
	
	/**
	 * AsyncTask utilizzato per effettuare le operazioni di logout; esse prevedono: <br>
	 * 1) salvataggio, nel file system, della Lista delle Conversazioni; <br>
	 * 2) effettuare il logout dal Server di Chat.
	 * @author Giulio
	 */
	private class LogoutAsyncTask extends AsyncTask<Void, Void, Void> {

		@Override
		protected Void doInBackground(Void... arg0) {
			
			// Effettua il logout
			boolean isConnected = chatClient.logout();
			System.out.println("Logout: isConnected = " + isConnected);	
			
			return null;
		}		
	}	
	
	/**
	 * AsyncTask usato per effettuare le operazioni di login; esse prevedono: <br>
	 * 1) il setup della configurazione della connessione; <br>
	 * 2) la connessione al Server di Chat; <br>
	 * 3) l'autenticazione al Server di Chat. <p>
	 * 
	 * Se l'autenticazione dovesse andare a buon fine, viene avviata l'Activity successiva.
	 * @author Giulio
	 */
	// AsyncTask usato per effettuare le operazioni di login (connessione e autenticazione al Server XMPP)
	private class LoginAsyncTask extends AsyncTask<Void, Void, Boolean>    {
        
		Context context;
		ProgressDialog pd;
		
		LoginAsyncTask(Context c) {
			context = c;
        }
        
		@Override
        protected void onPostExecute(Boolean isAuthenticated) {
            super.onPostExecute(isAuthenticated);
            
            // cancella la password dalla memoria
            EditText edit_text_password = (EditText) findViewById(R.id.edittext_password);
			edit_text_password.getText().clear();
         	            
            if (isAuthenticated) {				
            	// avvia l'activity successiva
				Intent intent = new Intent(context, ActivityConversationList.class);
				startActivity(intent);				
			} else {
				
				// mostra un messaggio di errore a video
				CharSequence text = "Authentication Failed!";
				int duration = Toast.LENGTH_SHORT;
				Toast toast = Toast.makeText(context, text, duration);
				toast.show();
			}            
        }
        
		@Override
        protected void onPreExecute() {
            super.onPreExecute();
            pd = ProgressDialog.show(ActivityMain.this, "Signing in", "Please wait...");
        }
        
		@Override
        protected Boolean doInBackground(Void... arg0) {
			
			// recupero i reference agli elementi grafici
			EditText edit_text_username = (EditText) findViewById(R.id.edittext_username);
			EditText edit_text_password = (EditText) findViewById(R.id.edittext_password);
			Spinner spinner_networks 	= (Spinner)  findViewById(R.id.spinner_networks);
			
			// preleva le informazioni
			String username = edit_text_username.getText().toString();
			String password = edit_text_password.getText().toString();
			String network = spinner_networks.getSelectedItem().toString();
			
			System.out.println("Username: " + username);
			System.out.println("Password: " + password);
			System.out.println(" Network: " + network);
			
			// FIXME: TOGLIERE!!!!! E' PER DEBUG!!!
			//username = "pippo";
			//password = "pippo";
			
			// effettuo il setup della connessione al server XMPP
			boolean isConnected = chatClient.setupXmppConnection(network);
			System.out.println("Is connected? " + isConnected);
			
			// prova ad effettuare il login
			boolean isAuthenticated = chatClient.login(username, password);
			System.out.println("Is authenticated? " + isAuthenticated);
			
			if (isAuthenticated) {
				System.out.println(className + "Authentication successful");
				chatClient.setupChatClient(getApplicationContext());	
			}
			
			pd.dismiss();
            return isAuthenticated;
		}   
    }
}
